package visiopuce.service.document;

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Analyse;
import visiopuce.objets.Cotation;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Resultat;
import visiopuce.objets.Utilisateur;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.CotationServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.ResultatServiceImpl;
import visiopuce.service.UtilisateurServiceImpl;

public class FeuilleCotationCSVFinal {

	public void createDocument() {
		try {
			Date d = new Date();
			java.sql.Date sqlDate = new java.sql.Date(d.getTime());

			SimpleDateFormat sdf = new SimpleDateFormat("dd_MM_yyyy");
			FileWriter pWriter = new FileWriter(ApplicationContexte.REPERTOIRE_COTATION + sdf.format(d) + "_activiteTotalCyto.csv", true);
			FileWriter pWriterB = new FileWriter(ApplicationContexte.REPERTOIRE_COTATION + sdf.format(d) + "_activiteTotalCytoB.csv", true);

			SimpleDateFormat formatterFR = new SimpleDateFormat("dd/MM/yyyy");

			String titreB = "Date_de_reception;Numero;UF_demandeur;UF_executant;Signataire;N_Hospitalisation;Code_Acte;Date_Acte;Type_B;Nb_B;;\r\n";
			String titre = "Date_de_reception;Numero;UF_demandeur;UF_executant;Signataire;N_Hospitalisation;Code_Acte;Date_Acte;;\r\n";

			pWriter.write(titre);
			pWriterB.write(titreB);

			List<String> numSejours = PrelevementServiceImpl.getInstance().getNumSejourCotationAEnvoyer();

			for (String numSejour : numSejours) {
				List<Cotation> cota = CotationServiceImpl.getInstance().getCotationByNumSejourNonEnvoyee(numSejour);
				if (cota.size() > 0) {
					if (cota != null && cota.size() >= 1) {
						for (Cotation cotation2 : cota) {
							String ligne = "";
							String ligneB = "";
							String dateCot = "";
							if (cotation2.getDate() != null) {
								dateCot = formatterFR.format(cotation2.getDate()) + " ";
							} else {
								dateCot = formatterFR.format(sqlDate) + " ";
								cotation2.setDate(sqlDate);
							}
							Prelevement prel = null;
							Personne per = null;
							Analyse ana = null;
							String ufExec = null;
							String ufPresc = null;
							String signataire = null;

							if (cotation2.getPersonne() != null) {
								per = PersonneServiceImpl.getInstance().getPersonneById(cotation2.getPersonne().getIdPersonne());
							}
							if (cotation2.getPrelevement() != null) {
								prel = PrelevementServiceImpl.getInstance().getPrelevementById(cotation2.getPrelevement().getIdPrelevement());
							}
							if (cotation2.getAnalyse() != null) {
								ana = AnalyseServiceImpl.getInstance().getAnalyseByIdAnalyse(cotation2.getAnalyse().getIdAnalyse());
							}

							if ((per == null || prel == null) && ana != null) {
								prel = PrelevementServiceImpl.getInstance().getPrelevementById(ana.getPrelevement().getIdPrelevement());
								if (prel != null) {
									per = PersonneServiceImpl.getInstance().getPersonneById(prel.getPersonne().getIdPersonne());
								}
							}
							if (prel != null && !prel.getNumeroPrelevement().contains("non reçu")) {
								if (per == null && prel != null) {
									per = PersonneServiceImpl.getInstance().getPersonneById(prel.getPersonne().getIdPersonne());
								}
								if (prel != null) {
									if (prel.getUfPresc() != null) {
										ufPresc = prel.getUfPresc().toString();
									} else {
										List<Prelevement> prelevements = PrelevementServiceImpl.getInstance().getAutrePrelevementFromPatient(prel);
										for (Prelevement prelevement : prelevements) {
											if (prelevement.getUfPresc() != null) {
												ufPresc = prelevement.getUfPresc().toString();
												break;
											}
										}
									}
								}

								if (per == null || prel == null) {

								} else {

									// ufPresc

									if (ana != null) {
										if (ufExec == null) {
											ufExec = ana.getUfExec().toString();
										}
									}

									// if (ufPresc == null) {
									// List<Analyse> lAnalyses =
									// AnalyseServiceImpl.getInstance().findAllByidPersonne(per.getIdPersonne());
									// if (lAnalyses == null ||
									// lAnalyses.size()
									// == 0) {
									// System.out.println("Pas d'analyse :"
									// +
									// cotation2);
									// } else {
									// for (Analyse analyse : lAnalyses) {
									// if (analyse.getUfPresc() != null) {
									// ufPresc =
									// analyse.getUfPresc().toString();
									// break;
									// }
									// }
									// }
									// }

									String date_reception = "Non rentrée";
									if (prel.getDateReception() != null) {
										date_reception = formatterFR.format(prel.getDateReception());
									} else {
										if (prel.getDatePrelevement() != null) {
											date_reception = formatterFR.format(prel.getDatePrelevement());
										}
									}
									if (date_reception.equals("Non rentrée")) {
										List<Prelevement> prelevements = PrelevementServiceImpl.getInstance().getAutrePrelevementFromPatient(prel);
										for (Prelevement prelevement : prelevements) {
											if (prelevement.getDateReception() != null) {
												date_reception = formatterFR.format(prelevement.getDateReception());
												break;
											} else {
												if (prelevement.getDatePrelevement() != null) {
													date_reception = formatterFR.format(prelevement.getDatePrelevement());
													break;
												}
											}
										}
									}

									if (ufPresc == null) {
										String infoIndi = prel.getInfoIndication();
										if (infoIndi != null && infoIndi.contains("xtraction") || (prel.getTypePrelevement() != null && prel.getTypePrelevement().getLibelle().contains("Culot"))) {
											ufPresc = "4270";
										} else {
											ufPresc = "0";
										}
									}

									if (ufPresc != null && ufPresc.length() == 3) {
										ufPresc = "0" + ufPresc;
									}
									if (ufPresc != null && ufPresc == "9999") {
										if (prel.getPrescripteur() != null) {
											Utilisateur prescripteur = UtilisateurServiceImpl.getInstance().getUtilisateurById(prel.getPrescripteur().getIdUtilisateur());
											if (prescripteur.getNom().equals("Puechberty") || prescripteur.getNom().equals("Sarda") || prescripteur.getNom().equals("Geneviève") || prescripteur.getNom().equals("Bigi") || prescripteur.getNom().equals("Blanchet")
													|| prescripteur.getNom().equals("Coubes") || prescripteur.getNom().equals("Pinson") || prescripteur.getNom().equals("Perez") || prescripteur.getNom().equals("Willems")) {
												ufPresc = "4270";
											} else {
												ufPresc = "9990";
											}
										}
										ufPresc = "9990";
									}
									// Signataire
									if (ana != null) {
										List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(ana.getIdAnalyse());
										for (Resultat resultat : resultats) {
											// signataire
											if (resultat.getSignataire() != null && signataire == null) {
												if (resultat.getSignataire().getIdUtilisateur() == 7) {
													signataire = "01300393";
													break;
												}
												if (resultat.getSignataire().getIdUtilisateur() == 9) {
													signataire = "01016924";
													break;
												}
												if (resultat.getSignataire().getIdUtilisateur() == 25) {
													signataire = "01060020";
													break;
												}
												if (resultat.getSignataire().getIdUtilisateur() == 26) {
													signataire = "01066809";
													break;
												}
												if (resultat.getSignataire().getIdUtilisateur() == 27) {
													signataire = "01069590";
													break;
												}
												if (resultat.getSignataire().getIdUtilisateur() == 2) {
													signataire = "01243551";
													break;
												}
											}
										}
									}

									if (ufExec == null) {
										if (prel.getSecteur() != null) {
											if (prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_PRENATAL) || prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_POSTNATAL) || prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_FOETO)) {
												ufExec = "4076";
												if (signataire == null) {
													signataire = "01066809";
												}
											}
											if (prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_PUCE_PRENATAL) || prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_PUCE_POSTNATAL) || prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_PUCE_FOETO)) {
												ufExec = "4274";
												if (signataire == null) {
													signataire = "01300393";
												}
											}
											if (prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_CELLULES)) {
												ufExec = "4252";
												if (signataire == null) {
													signataire = "01066809";
												}
											}
											if (prel.getSecteur().getLibelle().equals(ApplicationContexte.SECTEUR_BANQUE)) {
												ufExec = "4273";
												if (signataire == null) {
													signataire = "01300393";
												}
												if (ufPresc == null || ufPresc == "0") {
													ufPresc = "4270";
												}
											}
										}
									}
									if (signataire == null) {
										signataire = "01066809";
									}

									ligneB += date_reception + ";" + prel.getNumeroPrelevement() + ";" + ufPresc + ";" + ufExec + ";" + signataire + ";" + prel.getNumSejour() + ";" + cotation2.getTypeCotation().getLibelle().substring(1) + ";" + dateCot.trim() + ";"
											+ cotation2.getTypeCotation().getTypeB() + ";" + cotation2.getTypeCotation().getQuantite() + ";;";
									ligne += date_reception + ";" + prel.getNumeroPrelevement() + ";" + ufPresc + ";" + ufExec + ";" + signataire + ";" + prel.getNumSejour() + ";" + cotation2.getTypeCotation().getLibelle().substring(1) + ";" + dateCot.trim() + ";;";

									cotation2.setEnvoyer(sqlDate);
									CotationServiceImpl.getInstance().save(cotation2);
									if (prel.getCotationEnvoye() != 2) {
										prel.setCotationEnvoye(2);
										PrelevementServiceImpl.getInstance().save(prel);
									}
									// System.out.println("Ligne :" +
									// ligne);

								}

								pWriter.write(ligne + "\n");
								pWriterB.write(ligneB + "\n");
					
							}
						}
					}
				}

			}

			pWriter.close();
			pWriterB.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (HibernateException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
